/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ve.usb.cep.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.HashMap;
import com.google.gson.Gson;
import java.util.ArrayList;
//import javax.mail.Session;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.commons.lang.StringUtils;

import ve.usb.cep.db.SelectObject;
import ve.usb.cep.util.sqlWhere;
import ve.usb.cep.db.domainObjects.Usuario;
import ve.usb.cep.db.domainObjects.Curso;
import ve.usb.cep.db.domainObjects.Oferta;
import ve.usb.cep.db.models.CursoModel;
import ve.usb.cep.db.models.OfertaModel;
import ve.usb.cep.db.modelExceptions.CursoException;
import ve.usb.cep.db.modelExceptions.OfertaException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import ve.usb.cep.db.Session;
import ve.usb.cep.db.modelExceptions.ExoneradoException;
import ve.usb.cep.db.models.ExoneradoModel;
/**
 *
 * @author Andras
 */
public class CursoA extends ActionSupport{

    //Salida por texto
    protected String output;
    protected String error;
    protected HashMap err = new HashMap();
    protected String hlistarinscritos;
    protected String hgestionarevaluaciones;
    protected String hconsultarcalificaciones;
    protected String hvernotas;
    protected String idcurso;
    protected String diasoferta;

    @Override
    public String execute(){

        if (!"Administrador".equals(user().getRol())){
            error = "Sólo administradores pueden gestionar cursos";
            return ERROR;
        }

        return SUCCESS;
    }
    
    public String execute_exoneracion(){
        if (!"Administrador".equals(user().getRol())){
            error = "Sólo administradores pueden gestionar cursos";
            return ERROR;
        }
        try {
            Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
            if (u!=null) {
                /*if (!"Estudiante".equals(user().getRol())){
                    error = "Sólo estudiantes pueden ver el listado de ofertas para inscribir.";
                    return ERROR;
                }*/

                System.out.println("ANTES DEL CONNECTION!!!!!!!!!!!");
                Connection conn = Session.connection();
                ResultSet rs;
                ResultSet rs1;
                PreparedStatement pstmt;
                pstmt = conn.prepareStatement("select count(*) from oferta");
                rs = pstmt.executeQuery();
                System.out.println("DESPUES DE LA CUENTA!!!!!!!!!!!!");
                rs.next();
                int cantidadOfertas = rs.getInt(1);
                pstmt = conn.prepareStatement("select * from oferta");
                rs = pstmt.executeQuery();
                int idCurso;
                String ofertas = "";
                int i = 0;
                while (rs.next()) {
                    idCurso = rs.getInt("curso");   
                    pstmt = conn.prepareStatement("select * from curso where codigo = ? ");
                    pstmt.setInt(1,idCurso);
                    rs1 = pstmt.executeQuery();
                    rs1.next();
                    String nombreCurso = rs1.getString("nombre");
                    String dias = rs.getString("dias");
                    if (i==0) {
                        ofertas = ""+ rs.getInt("codigo")+":"+nombreCurso+" "+dias;
                        i=1;
                    } else {
                        ofertas = ofertas+";"+rs.getInt("codigo")+":"+nombreCurso+" "+dias;
                    }
                }
                System.out.println("**** Y LAS OFERTAS SON "+ofertas);
                ActionContext.getContext().getSession().put("nroOfertas",cantidadOfertas);
                ActionContext.getContext().getSession().put("opcOfertas",ofertas);
            }
            return SUCCESS;
        } catch (SQLException ex) {
            Logger.getLogger(OfertaA.class.getName()).log(Level.SEVERE, null, ex);
            return ERROR;
        }
    }

    public String execute_p(){

        if (!"Profesor".equals(user().getRol())){
            error = "Sólo profesores pueden ver los cursos dictados";
            return ERROR;
        }

        return SUCCESS;
    }
    
    public String execute_e(){

        if (!"Estudiante".equals(user().getRol())){
            error = "Sólo estudiantes pueden ver los cursos tomados";
            return ERROR;
        }

        return SUCCESS;
    }
	public String crearexonerado(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para agregar exoneraciones");
            return _finish();
        }
       
        HttpServletRequest r = ServletActionContext.getRequest();
        Connection conn = Session.connection();
        PreparedStatement pstmt;
        ResultSet rs;
        
        int cedula = -1;
        try{
            cedula = Integer.parseInt(r.getParameter("cedula"));
            if (cedula < 0){
                err.put("Cédula", "El número de cédula no puede ser negativo");
            } else {
                try {
                    pstmt = conn.prepareStatement("select * from usuario where rol = 'Estudiante' and cedula = ?");
                    pstmt.setInt(1,cedula);
                    rs = pstmt.executeQuery();
                    if (!rs.next()) {
                        err.put("Cédula", "El número de cédula indicado no pertenece a ningún participante");
                    } else {
                        try {
                            int codPart = rs.getInt("codigo");
                            pstmt = conn.prepareStatement("insert into exonerado (estudiante, oferta) values (?, ?)");
                            pstmt.setInt(1,codPart);
                            pstmt.setInt(2,Integer.parseInt(r.getParameter("codigoO")));
                            pstmt.executeUpdate();

                        } catch(java.sql.SQLException e){
                            e.printStackTrace();
                        }
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(CursoA.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }catch(java.lang.NumberFormatException e){
            err.put("Cédula", "Número de cédula inválido");
        }
        return _finish();
    }
    
    public String eliminarexonerado(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para eliminar exonerados");
            return _finish();
        }

        HttpServletRequest r = ServletActionContext.getRequest();
        int codigo = 0;
        try{
            codigo = Integer.parseInt(r.getParameter("id"));
        }catch(java.lang.NumberFormatException e){
            err.put("Código", "El registro con el número '" + r.getParameter("id") + "' no existe.");
        }

        if (!err.isEmpty()){
            return _finish();
        }

        try{
            new ExoneradoModel().delete(codigo);
            return _finish();
        }catch (ExoneradoException e){
            return _finishWithExceptions(e);
        }
    }
    public String crear(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para crear cursos");
            return _finish();
        }

        return editar();
    }

    public String editar(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para editar cursos");
            return _finish();
        }

        try{
            Curso c = _createDomainObject(), exist;
            if (null != c){
                try{
                    exist = new CursoModel().getUniqueNombre(c.getNombre(), c.getCodigo());
                }catch(CursoException e){
                    return _finishWithExceptions(e);
                }
                if (null != exist){
                    err.put("Nombre", "Ya existe un curso (" +
                            exist.getNombre() + ' ' + exist.getCategoria() +
                            ") registrado con ese nombre.");
                }
            }
            if (!err.isEmpty()){
                return _finish();
            }
            new CursoModel().set(c);
        }catch(CursoException e){
            return _finishWithExceptions(e);
        }
        return _finish();
    }
	
	public String cSeccion(){
        
        HttpServletRequest r = ServletActionContext.getRequest();
        Connection conn = Session.connection();
        PreparedStatement pstmt;
        ResultSet rs;
        
        int codigo;
        
        try {
            int idSeccionAntes = Integer.parseInt((String) ActionContext.getContext().getSession().get("idseccion"));
            pstmt = conn.prepareStatement("select codigo from seccion where numero=? and codigo_oferta = (select codigo_oferta from seccion where codigo = ?)");
            pstmt.setInt(1,Integer.parseInt(r.getParameter("seccion")));
            pstmt.setInt(2,idSeccionAntes);
            rs = pstmt.executeQuery();
            rs.next();
            codigo = rs.getInt(1);
            System.out.println("Y EL CODIGO DE LA OTRA SECCION ES: "+codigo);
            pstmt = conn.prepareStatement("select * from inscritos_seccion where codigo_seccion = ? and codigo_estudiante = ?");
            pstmt.setInt(1,codigo);
            pstmt.setInt(2,Integer.parseInt(r.getParameter("id")));
            rs = pstmt.executeQuery();
            if (rs.next()) {
                err.put("Sección", "Ya el participante se encuentra asignado a esa sección.");
                return _finish();
            }
            pstmt = conn.prepareStatement("select * from seccion where codigo = ? and max_estudiantes = (select count(*) from inscritos_seccion where codigo_seccion = ?)");
            pstmt.setInt(1,codigo);
            pstmt.setInt(2,codigo);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                err.put("Sección", "La sección indicada ya se encuentra llena. Para asignarle otro participante debe primero aumentar su capacidad máxima.");
                return _finish();
            }    
            pstmt = conn.prepareStatement("update inscritos_seccion set codigo_seccion=? where codigo_estudiante=? and codigo_seccion=?");
            pstmt.setInt(1,codigo);            
            pstmt.setInt(2,Integer.parseInt(r.getParameter("id")));
            pstmt.setInt(3,idSeccionAntes);  
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(CursoA.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception e) {}
        
        try {
            String aprobado = r.getParameter("aprobado");
            pstmt = conn.prepareStatement("update inscritos_seccion set aprobado=? where codigo_estudiante=? and codigo_seccion=?");
            pstmt.setString(1,aprobado);            
            pstmt.setInt(2,Integer.parseInt(r.getParameter("id")));
            pstmt.setInt(3,Integer.parseInt((String) ActionContext.getContext().getSession().get("idseccion")));  
            pstmt.executeUpdate();
        } catch (Exception e) {}
        return _finish();
    }

    public String listar(){
        CursoModel p = new CursoModel();
        SelectObject s;
        ArrayList<Curso> cursos;
        int rowCount;
        try{
            s = _createSearchObject();
            if (!err.isEmpty()){
                return _finish();
            }
            p = new CursoModel();
            cursos = p.getCustom(s);
            rowCount = p.getRowCount();
        }catch (CursoException e){
            return _finishWithExceptions(e);
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap[] m = new HashMap[cursos.size()];
        int i = 0;

        for (Curso o : cursos){
            String[] c = new String[5];
            c[0] = o.getNombre();
            c[1] = Integer.toString(o.getCosto());
            c[2] = o.getCategoria();
            c[3] = o.getDescripcion();
            c[4] = Integer.toString(o.getHorasDur());
            HashMap e = new HashMap();
            e.put("id", o.getCodigo());
            e.put("cell", c);
            m[i] = e;

            ++ i;
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / (double) s.getRows()));
        r.put("page", s.getPage());
        r.put("records", s.getRows());
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
    
    public String ver_notas(){
        ActionContext.getContext().getSession().put("idofertanotas",hvernotas);
        return SUCCESS;
    }
    
    public String listarnotas(){
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        hvernotas = (String) ActionContext.getContext().getSession().get("idofertanotas");
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from evaluacion e, calificacion c where e.codigo = c.codigo_evaluacion and codigo_estudiante = ? and codigo_seccion = (select codigo_seccion from inscritos_seccion where codigo_estudiante = ?)");
            pstmt.setInt(1,user().getCodigo());
            pstmt.setInt(2,user().getCodigo());
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select c.codigo, nombre, porcentaje, nota from evaluacion e, calificacion c where e.codigo = c.codigo_evaluacion and codigo_estudiante = ? and codigo_seccion = (select codigo_seccion from inscritos_seccion where codigo_estudiante = ?)");
            pstmt.setInt(1,user().getCodigo());
            pstmt.setInt(2,user().getCodigo());
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[3];
                c[0] = rs.getString("nombre");
                c[1] = rs.getString("porcentaje");
                c[2] = rs.getString("nota");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
    
    public String consultar_calificaciones(){
        if (!"Profesor".equals(user().getRol())){
            error = "Sólo profesores pueden gestionar las calificaciones";
            return ERROR;
        }
        
        ActionContext.getContext().getSession().put("idevaluacion",hconsultarcalificaciones);
        return SUCCESS;
    }
    
    public String listarcalificaciones(){
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        hconsultarcalificaciones = (String) ActionContext.getContext().getSession().get("idevaluacion");
        System.out.println("EVALUACION " + hconsultarcalificaciones);
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from calificacion where codigo_evaluacion = ?");
            pstmt.setInt(1,Integer.parseInt(hconsultarcalificaciones));
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select c.codigo, nombre, apellido, nota from usuario u, calificacion c where u.codigo = c.codigo_estudiante and c.codigo_evaluacion = ?");
            pstmt.setInt(1,Integer.parseInt(hconsultarcalificaciones));
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[3];
                c[0] = rs.getString("nombre");
                c[1] = rs.getString("apellido");
                c[2] = rs.getString("nota");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
    
    public String editarcalificacion(){

        if (!"Profesor".equals(user().getRol())){
            err.put("error", "debe ser profesor para editar calificacion");
            return _finish();
        }
        
        HttpServletRequest r = ServletActionContext.getRequest();
        Connection conn = Session.connection();
        PreparedStatement pstmt;
        ResultSet rs;
        int porcentaje, nota;
        try {
            nota = Integer.parseInt(r.getParameter("nota"));
            
            if (nota < 0) {
                err.put("Error","La nota debe ser mayor o igual que 0");
                return _finish();
            }
            
            pstmt = conn.prepareStatement("select porcentaje from evaluacion where codigo = (select e.codigo from evaluacion e, calificacion c where e.codigo = c.codigo_evaluacion and c.codigo=?)");
            pstmt.setInt(1,Integer.parseInt(r.getParameter("id")));
            rs = pstmt.executeQuery();
            rs.next();
            porcentaje = rs.getInt(1);
            
            if (nota > porcentaje) {
                err.put("Nota Maxima","La máxima nota en esta evaluación es " + porcentaje);
                return _finish();
            }
            
            pstmt = conn.prepareStatement("update calificacion set nota=? where codigo=?");
            pstmt.setInt(1,Integer.parseInt(r.getParameter("nota")));
            pstmt.setInt(2,Integer.parseInt(r.getParameter("id")));
            pstmt.executeUpdate();
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        return _finish();
    }
    
    public String resetearcalificaciones() {
        if (!"Profesor".equals(user().getRol())){
            err.put("error", "debe ser profesor para limpiar calificaciones");
            return _finish();
        }
        
        Connection conn = Session.connection();
        PreparedStatement pstmt;

        try {
            pstmt = conn.prepareStatement("update calificacion set nota=null where codigo_evaluacion = ?");
            pstmt.setInt(1,Integer.parseInt((String) ActionContext.getContext().getSession().get("idevaluacion")));
            pstmt.executeUpdate();
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        return _finish();
    }
    
    public String gestionar_evaluaciones(){
        if (!"Profesor".equals(user().getRol())){
            error = "Sólo profesores pueden gestionar las evaluaciones";
            return ERROR;
        }
        
        ActionContext.getContext().getSession().put("idseccioneval",hgestionarevaluaciones);
        return SUCCESS;
    }
    
    public String listarevaluaciones(){
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        hgestionarevaluaciones = (String) ActionContext.getContext().getSession().get("idseccioneval");
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from evaluacion where codigo_seccion = ?");
            pstmt.setInt(1,Integer.parseInt(hgestionarevaluaciones));
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select codigo, nombre, descripcion, porcentaje from evaluacion where codigo_seccion = ?");
            pstmt.setInt(1,Integer.parseInt(hgestionarevaluaciones));
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[3];
                c[0] = rs.getString("nombre");
                c[1] = rs.getString("descripcion");
                c[2] = rs.getString("porcentaje");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
    
    public String crearevaluacion(){

        if (!"Profesor".equals(user().getRol())){
            err.put("error", "debe ser profesor para crear evaluaciones");
            return _finish();
        }
        
        HttpServletRequest r = ServletActionContext.getRequest();
        Connection conn = Session.connection();
        PreparedStatement pstmt;
        ResultSet rs;

        try {
            pstmt = conn.prepareStatement("insert into evaluacion (nombre, descripcion, porcentaje, codigo_seccion) values (?, ?, ?, ?)");
            pstmt.setString(1,r.getParameter("nombre"));
            pstmt.setString(2,r.getParameter("descripcion"));
            pstmt.setInt(3,Integer.parseInt(r.getParameter("porcentaje")));
            pstmt.setInt(4,Integer.parseInt((String) ActionContext.getContext().getSession().get("idseccioneval")));
            pstmt.executeUpdate();
            
            pstmt = conn.prepareStatement("select i.codigo_estudiante, e.codigo from inscritos_seccion i, evaluacion e where i.codigo_seccion = ? and e.codigo = (select max(codigo) from evaluacion)");
            pstmt.setInt(1,Integer.parseInt((String) ActionContext.getContext().getSession().get("idseccioneval")));
            rs = pstmt.executeQuery();
            
            while (rs.next()) {
                pstmt = conn.prepareStatement("insert into calificacion (codigo_estudiante, codigo_evaluacion) values (?, ?)");
                pstmt.setInt(1,rs.getInt("codigo_estudiante"));
                pstmt.setInt(2,rs.getInt("codigo"));
                pstmt.executeUpdate();
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        return _finish();
    }

    public String editarevaluacion(){

        if (!"Profesor".equals(user().getRol())){
            err.put("error", "debe ser profesor para editar evaluaciones");
            return _finish();
        }
        
        HttpServletRequest r = ServletActionContext.getRequest();
        Connection conn = Session.connection();
        PreparedStatement pstmt;

        try {
            pstmt = conn.prepareStatement("update evaluacion set nombre=?, descripcion=?, porcentaje=? where codigo=?");
            pstmt.setString(1,r.getParameter("nombre"));
            pstmt.setString(2,r.getParameter("descripcion"));
            pstmt.setInt(3,Integer.parseInt(r.getParameter("porcentaje")));
            pstmt.setInt(4,Integer.parseInt(r.getParameter("id")));
            pstmt.executeUpdate();
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        return _finish();
    }
    
    public String eliminarevaluacion(){

        HttpServletRequest r = ServletActionContext.getRequest();
        Connection conn = Session.connection();
        PreparedStatement pstmt;
        int codigo = 0;
        try{
            codigo = Integer.parseInt(r.getParameter("id"));
        }catch(java.lang.NumberFormatException e){
            err.put("Código", "El registro con el número '" + r.getParameter("id") + "' no existe.");
        }

        try{
            pstmt = conn.prepareStatement("delete from evaluacion where codigo=?");
            pstmt.setInt(1,codigo);
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        
        return _finish();
    }
    
	public String listarexonerados(){
        ExoneradoModel p = new ExoneradoModel();
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from exonerado e, oferta o, curso c, usuario u where e.oferta = o.codigo and o.curso = c.codigo and e.estudiante = u.codigo");
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select e.estudiante, u.nombre, u.apellido, u.cedula, e.oferta, c.nombre, o.dias, e.codigo from exonerado e, oferta o, curso c, usuario u where e.oferta = o.codigo and o.curso = c.codigo and e.estudiante = u.codigo");
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[7];
                c[0] = rs.getString(1);
                c[1] = rs.getString(2);
                c[2] = rs.getString(3);
                c[3] = rs.getString(4);
                c[4] = rs.getString(5);
                c[5] = rs.getString(6);
                c[6] = rs.getString(7);
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
	
    public String listardictados(){
        CursoModel p = new CursoModel();
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from curso c, oferta o, seccion s where c.codigo = o.curso and o.codigo = s.codigo_oferta and s.codigo_prof = ?");
            pstmt.setInt(1,user().getCodigo());
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select s.codigo, nombre, numero, categoria, descripcion, dias from curso c, oferta o, seccion s where c.codigo = o.curso and o.codigo = s.codigo_oferta and s.codigo_prof = ?");
            pstmt.setInt(1,user().getCodigo());
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[6];
                c[0] = rs.getString("nombre");
                c[1] = rs.getString("numero");
                c[2] = rs.getString("categoria");
                c[3] = rs.getString("descripcion");
                c[4] = rs.getString("dias");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
    
    public String listartomados(){
        CursoModel p = new CursoModel();
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from inscritos_seccion ins, seccion s, oferta o, curso c where ins.codigo_seccion = s.codigo and s.codigo_oferta = o.codigo and o.curso = c.codigo and ins.codigo_estudiante = ?");
            pstmt.setInt(1,user().getCodigo());
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select c.*, numero, dias, o.codigo fcodigo from inscritos_seccion ins, seccion s, oferta o, curso c where ins.codigo_seccion = s.codigo and s.codigo_oferta = o.codigo and o.curso = c.codigo and ins.codigo_estudiante = ?");
            pstmt.setInt(1,user().getCodigo());
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[6];
                c[0] = rs.getString("nombre");
                c[1] = rs.getString("numero");
                c[2] = rs.getString("categoria");
                c[3] = rs.getString("descripcion");
                c[4] = rs.getString("dias");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("fcodigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }
    
    public String listar_ins(){
        ActionContext.getContext().getSession().put("idseccion",hlistarinscritos);

        return SUCCESS;
    }
    
    public String listar_ins2(){
        ActionContext.getContext().getSession().put("idseccion",hlistarinscritos);
        try {
            Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
            if (u!=null) {
                System.out.println("ANTES DEL CONNECTION!!!!!!!!!!!");
                Connection conn = Session.connection();
                ResultSet rs;
                PreparedStatement pstmt;
                pstmt = conn.prepareStatement("select * from seccion where codigo_oferta = (select codigo_oferta from seccion where codigo = ?)");
                System.out.println("EL VALOR DE hlistarinscritos ES " +hlistarinscritos);
                pstmt.setInt(1,Integer.parseInt(hlistarinscritos));
                rs = pstmt.executeQuery();
                int nroSeccion;
                String secciones = "";
                int i = 0;
                while (rs.next()) {
                    nroSeccion = rs.getInt("numero");
                    if (i==0) {
                        secciones = ""+ nroSeccion+":"+nroSeccion;
                        i=1;
                    } else {
                        secciones = secciones+";"+nroSeccion+":"+nroSeccion;
                    }
                }
                System.out.println("**** Y LAS SECCIONES SON "+secciones);
                ActionContext.getContext().getSession().put("opcSecciones",secciones);
            }
            return SUCCESS;
        } catch (SQLException ex) {
            Logger.getLogger(OfertaA.class.getName()).log(Level.SEVERE, null, ex);
            return ERROR;
        }
    }
    
    public String listarinscritos(){
        CursoModel p = new CursoModel();
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        hlistarinscritos = (String) ActionContext.getContext().getSession().get("idseccion");
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
            
            pstmt = conn.prepareStatement("select count(*) from inscritos_seccion ins, usuario u where ins.codigo_estudiante = u.codigo and ins.codigo_seccion = ?");
            pstmt.setInt(1,Integer.parseInt(hlistarinscritos));
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select u.*, numero, aprobado from inscritos_seccion ins, usuario u, seccion s where ins.codigo_seccion = s.codigo and ins.codigo_estudiante = u.codigo and ins.codigo_seccion = ?");
            pstmt.setInt(1,Integer.parseInt(hlistarinscritos));
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[7];
                c[0] = rs.getString("nombre");
                c[1] = rs.getString("apellido");
                c[2] = rs.getString("cedula");
                c[3] = rs.getString("telefono");
                c[4] = rs.getString("correo");
                c[5] = rs.getString("numero");
                c[6] = rs.getString("aprobado");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }

    public String eliminar(){

        HttpServletRequest r = ServletActionContext.getRequest();
        int codigo = 0;
        try{
            codigo = Integer.parseInt(r.getParameter("id"));
        }catch(java.lang.NumberFormatException e){
            err.put("Código", "El registro con el número '" + r.getParameter("id") + "' no existe.");
        }

        try{
            sqlWhere w = new sqlWhere();
            sqlWhere.rule[] c = new sqlWhere.rule[1];
            c[0] = w.new rule();
            c[0].setField("curso");
            c[0].setOp("eq");
            c[0].setData(Integer.toString(codigo));
            w.setRules(c);
            ArrayList<Oferta> ol = new OfertaModel().getCustom(
                new SelectObject((short) 1, (short) 1, "", "", w)
            );
            if (0 < ol.size()){
                Oferta o = ol.get(0);
                err.put("error", "La oferta (" + o.getAno() + ", " + o.getPeriodo() +
                        ", " + o.getDias() + ") aun existe para este curso.");
            }
        }catch(OfertaException e){
            //Si no se pudo validar y existía el registro, más abajo va a dar el error feo
            e.printStackTrace();
        }

        if (!err.isEmpty()){
            return _finish();
        }

        try{
            new CursoModel().delete(codigo);
            return _finish();
        }catch (CursoException e){
            return _finishWithExceptions(e);
        }
    }
    
    public String ofertar(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para ofertar cursos");
            return _finish();
        }
        System.out.println(idcurso);
        System.out.println(diasoferta);
        
        try {
            Connection conn = Session.connection();
            PreparedStatement pstmt;
            ResultSet rs;
        
            pstmt = conn.prepareStatement("select dias from oferta where curso = ?");
            pstmt.setInt(1,Integer.parseInt(idcurso));
            rs = pstmt.executeQuery();
            
            while (rs.next()) {
                if (diasoferta.equals(rs.getString(1))) {
                    err.put("error", "el curso ya fue ofertado en ese horario");
                    return _finish();
                }
            }
            
            pstmt = conn.prepareStatement("insert into oferta (curso, abierto, dias) values (?,1,CAST(? AS dias))");
            pstmt.setInt(1,Integer.parseInt(idcurso));
            pstmt.setString(2,diasoferta);
            pstmt.executeUpdate();
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        return _finish();
    }

    protected Curso _createDomainObject()
        throws CursoException
    {

        HttpServletRequest r = ServletActionContext.getRequest();

        int codigo = -1;
        if ("_empty".equals(r.getParameter("id"))){
            codigo = 0;
        }else{
            try{
                codigo = Integer.parseInt(r.getParameter("id"));
            }catch(java.lang.NumberFormatException e){
                err.put("Codigo", "Número de registro inválido");
            }
        }

        int costo = -1;
        try{
            costo = Integer.parseInt(r.getParameter("costo"));
            if (costo < 0){
                err.put("Costo", "El costo no puede ser negativo");
            }
        }catch(java.lang.NumberFormatException e){
            err.put("Inscritos", "Costo inválido");
        }

        short horasDur = -1;
        try{
            horasDur = (short) Integer.parseInt(r.getParameter("horas_dur"));
            if (horasDur < 0){
                err.put("Duración", "La duración del curso no puede ser negativa");
            }
        }catch(java.lang.NumberFormatException e){
            err.put("Inscritos", "Duración inválido");
        }

        return new Curso(
            codigo,
            r.getParameter("nombre"),
            costo,
            r.getParameter("categoria"),
            r.getParameter("descripcion"),
            horasDur
        );
    }

    protected SelectObject _createSearchObject(){

        HttpServletRequest r = ServletActionContext.getRequest();
        sqlWhere w = (sqlWhere) new Gson().fromJson(
                r.getParameter("filters"), sqlWhere.class);
        if (null == w){
            w = new sqlWhere();
        }

        short rows = 20, page = 1;
        try{
            rows = (short) Integer.parseInt(r.getParameter("rows"));
            page = (short) Integer.parseInt(r.getParameter("page"));
        }catch(java.lang.NumberFormatException e){
            
        }
        return new SelectObject(
            rows,
            page,
            r.getParameter("sidx"),
            r.getParameter("sord"),
            w
        );
    }

    protected String _finishWithExceptions(Exception e){
        ServletActionContext.getResponse()
                .setStatus(HttpServletResponse.SC_BAD_REQUEST);

        //Para los casos en los que el error sea interno, err estará vacío.
        if (null != e){
            e.printStackTrace();
            err.put("error interno", e.getMessage());
            output = new Gson().toJson(err);
        }
        return ERROR;
    }

    protected String _finish(){
        if (!err.isEmpty()){
            ServletActionContext.getResponse()
                .setStatus(HttpServletResponse.SC_BAD_REQUEST);
            output = new Gson().toJson(err);
            return ERROR;
        }

        return SUCCESS;
    }

    public String autocomplete(){

        HttpServletRequest r = ServletActionContext.getRequest();
        sqlWhere w = new sqlWhere();
        sqlWhere.rule[] c = new sqlWhere.rule[1];
        c[0] = w.new rule();
        c[0].setField("nombre");
        c[0].setOp("cn");
        c[0].setData(r.getParameter("q"));
        w.setRules(c);
        
        ArrayList<Curso> cursos;
        try{
            cursos = new CursoModel().getCustom(new SelectObject(
                    (short) Integer.parseInt(r.getParameter("limit")),
                    (short) 1,
                    "nombre",
                    "asc",
                    w
            ));
        }catch (CursoException e){
            ServletActionContext.getResponse()
                    .setStatus(HttpServletResponse.SC_BAD_REQUEST);
            e.printStackTrace();
            output = "hubo un error: " + e.getMessage();
            return ERROR;
        }

        String[] outputArr = new String[cursos.size()];
        int i = 0;
        for (Curso cur : cursos){
            outputArr[i] = cur.getNombre();
            ++ i;
        }
        output = StringUtils.join(outputArr, "\n");

        return SUCCESS;
    }

    protected Usuario user(){

        Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
        if (null == u){
            u = new Usuario(0, "", "", "", 0, "Visitante", "", "", "", "");
        }
        return u;
    }

    public String getOutput(){
        return output;
    }

    public String getError(){
        return error;
    }
    
    public void setHlistarinscritos(String hlistarinscritos){
        this.hlistarinscritos = hlistarinscritos;
    }
    
    public void setHgestionarevaluaciones(String hgestionarevaluaciones){
        this.hgestionarevaluaciones = hgestionarevaluaciones;
    }
    
    public void setHconsultarcalificaciones(String hconsultarcalificaciones){
        this.hconsultarcalificaciones = hconsultarcalificaciones;
    }
    
    public void setHvernotas(String hvernotas){
        this.hvernotas = hvernotas;
    }
    
    public void setIdcurso(String idcurso){
        this.idcurso = idcurso;
    }
    
    public void setDiasoferta(String diasoferta){
        this.diasoferta = diasoferta;
    }
}
